package com.zenithmind.chat.pojo.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import com.zenithmind.common.base.BaseEntity;
import com.zenithmind.chat.enums.FriendRequestStatus;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.time.LocalDateTime;

/**
 * 好友申请实体类 - 遵循单一职责原则
 * 只负责好友申请的核心数据，用户详细信息通过关联查询获取
 *
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("chat_friend_request")
public class ChatFriendRequest extends BaseEntity {

    /**
     * 申请人ID
     */
    private String requesterId;

    /**
     * 目标用户ID
     */
    private String targetId;

    /**
     * 申请状态
     */
    private FriendRequestStatus status;

    /**
     * 申请消息
     */
    private String requestMessage;

    /**
     * 回复消息
     */
    private String responseMessage;

    /**
     * 申请时间
     */
    private LocalDateTime requestTime;

    /**
     * 回复时间
     */
    private LocalDateTime responseTime;

    /**
     * 过期时间
     */
    private LocalDateTime expireTime;

    // === 业务方法 - 遵循迪米特法则 ===

    /**
     * 检查申请是否可以被指定用户处理
     *
     * @param userId 用户ID
     * @return 是否可以处理
     */
    public boolean canBeHandledBy(String userId) {
        return targetId != null && targetId.equals(userId);
    }

    /**
     * 检查申请是否可以被撤回
     *
     * @param userId 用户ID
     * @return 是否可以撤回
     */
    public boolean canBeWithdrawnBy(String userId) {
        return requesterId != null && requesterId.equals(userId) &&
               status == FriendRequestStatus.PENDING;
    }

    /**
     * 检查申请是否已过期
     *
     * @return 是否已过期
     */
    public boolean isExpired() {
        return expireTime != null && expireTime.isBefore(LocalDateTime.now());
    }

    /**
     * 检查申请是否已处理
     *
     * @return 是否已处理
     */
    public boolean isProcessed() {
        return status != FriendRequestStatus.PENDING;
    }

    /**
     * 处理申请
     *
     * @param accept 是否同意
     * @param responseMessage 回复消息
     */
    public void process(boolean accept, String responseMessage) {
        this.status = accept ? FriendRequestStatus.ACCEPTED : FriendRequestStatus.REJECTED;
        this.responseMessage = responseMessage;
        this.responseTime = LocalDateTime.now();
    }

    /**
     * 添加来源
     */
    private String addSource;
}
